package com.newly.center.sys.service.auth.api;

import com.newly.common.base.constants.AuthConstant;
import com.newly.common.base.entity.auth.AuthPayload;
import com.newly.common.base.entity.sys.api.ApiVo;
import com.newly.common.base.entity.sys.captcha.vo.CaptchaVo;
import com.newly.common.base.exception.NewlyAuthException;

import java.util.List;

/**
 * @author gjm guan
 * @date 2021/9/12 10:28
 * @desc 鉴权业务接口
 */
public interface IAuthService {

    /**
     * 登出，清除缓存数据
     *
     * @return 登出标识
     */
    boolean logout();

    /**
     * 生成图形验证码，格式为base64，返回给前段。
     * 并将其存入二维码对象存入redis中
     *
     * @return CaptchaVo.class
     */
    CaptchaVo generateCaptcha();

    /**
     * 校验图形验证阿妈
     *
     * @param captchaId 图形验证码id
     * @param code      code码，需要比较的输入码
     * @return 验证码校验通过返回true，失败返回false
     */
    boolean checkCaptcha(String captchaId, String code);

    /**
     * 扫描所有的api接口
     *
     * @return List ApiVo.class
     */
    List<ApiVo> getApis();

    /**
     * 通过租户id获取权限载体（详情信息），包括角色，权限，权限实体
     *
     * @param tenantId 租户id
     * @return List AuthPayload.class
     */
    List<AuthPayload> getAuthPayloads(Long tenantId) throws NewlyAuthException;

    /**
     * 刷新当前租户权限载体（详情信息），包括角色，权限实体
     *
     * @return 刷新成功返回true
     */
    boolean flushAuthPayloads();

    /**
     * 往指定类型的权限添加权限实体
     *
     * @param entityType 权限实体类型
     * @param entityId   权限实体id
     * @return 添加成功返回true
     */
    boolean pushAuthPayloads(AuthConstant.AuthEntityType entityType, String entityId);

    /**
     * 往指定类型的权限添加权限实体
     *
     * @param entityType 权限实体类型
     * @param entityIds  权限实体id
     * @return 添加成功返回true
     */
    boolean pushAuthPayloads(AuthConstant.AuthEntityType entityType, List<String> entityIds);

    /**
     * 从指定类型的权限移除权限实体
     *
     * @param entityType 权限实体类型
     * @param entityIds  权限实体id
     * @return 移除成功返回true
     */
    boolean popAuthPayloads(AuthConstant.AuthEntityType entityType, List<String> entityIds);

    /**
     * 从指定类型的权限移除权限实体
     *
     * @param entityType 权限实体类型
     * @param entityId  权限实体id
     * @return 移除成功返回true
     */
    boolean popAuthPayloads(AuthConstant.AuthEntityType entityType, String entityId);
}
